データサイエンス

トピックス

植物資源の利用、食生活に関する文献、ウェブに公開されているデータとその解析、DX・データサイエンスに関する話題、データ解析に用いたプログラムのコード(主にPython)などを紹介します。

Kaggle Dataset ”Corn, Oat, Cereals & Grains Futures Data"のEDAと機械学習モデル_01

カテゴリー: データサイエンス

作成日: 2023-10-30

 Kaggleは世界最大級のデータサイエンスコンペティションプラットホームです。Kaggleは企業や行政などの組織とデータサイエンティスト/機械学習エンジニアを結びつけるプラットホームとなっていて、コンペティションの他に、約20万のdatasetsとそれらdatasetの解析や機械学習モデルのプログラムcodeが投稿されています。どのようなデータが公開されているかを知ることができ、さらにデータ解析や機械学習モデル作成するためのアルゴリズムの知識を深め、そのプログラミングをトレーニングすることができます。 まずダウンロードしたデータの概要から詳細までを解析します。これを探索的データ解析:EDA(Exploratory data analysis)と言います。

Dataset "Corn, Oat, Cereals & Grains Futures Data"について

 穀物の収量や価格の予測は食品原料の安定な供給に重要です。KaggleのDatasetで穀物に関して検索するといくつかのDatasetが見つかります。
 今回は"Corn, Oat, Cereals & Grains Futures Data"とそのデータ解析と機械学習モデルを紹介します。このデータセットの提供者はDatesetsランク148位/104,913のDatasets Expertです。またNotebooks Expertでもあり、Kaggleで活発な活動をしています。
このデータセットは、トウモロコシ、オート麦、その他の穀物に関連する先物の包括的かつ最新のデータを提供しています。先物とは、特定の穀物を、将来の日付にあらかじめ決められた価格で、買い手が購入し、売り手が売却することを義務づける契約です。

 

このデータセットの使い方として以下が提示されています。

  • 穀物収量の予測:機械学習モデルを使って穀物先物価格と過去のデータを相関させ、潜在的な収穫量を予測する。
  • 気象イベントの影響分析:ディープラーニング技術を導入して、穀物価格の動きと重要なパターンとの関係を理解する。
  • 穀物価格予測:将来の穀物価格を予測する時系列予測モデルを開発して、トレーダーや利害関係者の意思決定を支援する。
  • このデータセットへのアクティビティ

    Usability(使いやすさ)が10と最高評価となっています。Completeness、Credibility、Compatibility の各項目の評価が100%となっていて、非常に使いやすい、信頼の高いデータセットです。

    • Usability: 10
    • Licence: Attribution-NonCommercial 4.0 International
    • Votes(いいね): 28
    • Views: 5,002
    • Downloads: 857
    • Notebooks(プログラムコード): 4

    データファイルの構成

    ダウンロードしたデータセットに含まれているall_grains_data.csv ファイルを使います。

    • ファイル形式: csv
    • ファイル容量: 2.1 MB
    • 列数(データ項目): 8
    • 行数(データ数): 35,033
    •  

    今回のデータ解析手順

    Pythonで作成したプログラムにて下記の手順で解析しました。

    1. ダウンロードしたzipファイルの解凍
    2. データファイルの読み込み
    3. 列名(項目名)と型を確認
    4. 列'date'を時系列データへ変換:文字列型なので時系列型へ変換
    5. 欠損値の有無を確認: 欠損値はありませんでした
    6. 基本データの可視化
    7. 列 'open' すなわちopen priceを目的変数として機械モデルを作成

    all_grains_data.csvの構成

    csvファイルを読み込んだデータフレーム(df)に関数df.info()を実行すると、下記が表示されます。8つの列と35033の行があります。列'ticker'は穀物先物市場独自の穀物の相場記号。'commodity'は穀物の種類で、'Corn'、 'Oat'、 'KC HRW Wheat'、 'Rough Rice'、 'Soybean Oil'、 'Soybean'が含まれています。'ticker'と'commodity'は同じデータですので、'ticker'は削除します。'open'は市場のオープニング価格、'close'は終了時の価格、'high'は最高価格、'oow'は最低価格です。'volume'は取引数です。どの列にも欠損値はありません。'date'は年月日ですがデータタイプがobject(文字列)になっていますので時系列型に変換します。

    df.info()

     表の頭から5行を表示

    df.head()

    open priceデータの時系列推移を可視化

     時系列データは、周期的な変動、トレンド的な変動、その他の突発的な変動に分けて分析するのが基本です。
    各グラフを一見すると、大豆、トウモロコシ、小麦の動きは非常に良く似ています。大豆がやや上昇傾向が強いようです。2020年には米がピークを迎え、他の作物にはありません。ベトナムが米の輸出枠を設定したためだそうです。

    open_price_05 open_price_01 open_price_03 open_price_02 open_price_04

     ちなみに試験運用中の生成AIのGoogle検索体験SGE(Google Search Generative Experience)(かなり便利です)で穀物の価格上昇について聞いてみたところ、以下のサイトがヒットしました。上図価格変動要因の推測に参考になります。

    Pycaretによる価格予測のための機械学習モデルの作成

     pythonによる機械学習モデルの作成ではライブラリscikit-learnが良く使われていますが、今回はローコード(基本的には2行のコード)で説明変数の前処理(欠損値の対応、カテゴリー変数のone-hot encoding、クロスバリデーションなど)と網羅的に多くのモデル(回帰では19モデル)を作成してくれるライブラリPycaretを用いました。

    作成された精度上位の10モデルを下表に示します。

    6種の指標全てでExtra Trees Regressorがトップになりました。Pycaretでは、デフォルトのパラメータで作成されていますので、トップ3ぐらいのモデルに絞り込んでパラメータのチューニングをすることができます。

    compare_model_01

    Prediction Error for Extra Trees Regressor model

    Prediction Error for ETR

    Feature Importance Plot for Extra Trees Regressor model

     Feature Importance は、機械学習モデルの解釈に使用される指標です。各特徴量がターゲットにどれだけ影響を与えたかを表し、モデルが重要視している要因を知ることができます。Feature Importance は、ジニ不純度(Gini impurity)に基づいて計算されます。具体的には、ある特徴量で分割することでどれくらいジニ不純度を下げられるのかを評価するそうです。

    feature_importance

     R^2=0.9987であり、Exta Trees Regressorは、作物の種類と日付を考慮することで、open priceに対して非常に優れたモデル予測を提供すると言うことができます。
     このモデルにとってより重要なパラメータは、作物の種類と年であり、月はある程度の情報を提供するが、日はあまり重要ではないようです。

    Pythonによるプログラムのコード

    実際に解析に用いたプログラムのコードです。あくまで参考です。自己責任で適当に編集して試してください。

    開発・実行環境:Google Colaboratory

    ダウンロードしたzipファイルの解凍

    datasetのあるサイトページからダウンロードするとzipファイルでダウンロードされますので、解凍します。unzipフォルダに解凍されたcsvファイルが保存されます。

    
    # Import
    import zipfile
    							
    # unpack
    filename = 'archive.zip'
    with zipfile.ZipFile(filename) as zf:
    	f_list = zf.namelist()
    with zipfile.ZipFile(file) as zf:
    	for fcsv in f_list:
    		zf.extract(fcsv, 'unzip')
    
    

    install

    
    !pip install pycaret		# ローコードで機械モデルを作成
    
    

    import

    
    from pycaret.regression import *
    import numpy as np
    import pandas as pd
    import matplotlib.pyplot as plt
    import seaborn as sns
    
    

    データの読み込みと抽出

    
    # データの読み込み
    df = pd.read_csv("all_grains_data.csv")
    # 列'date'を時系列データに変換
    df['date'] = pd.to_datetime(df['date'], format'%Y-%m-%d')
    print(df.shape)    # 列数と行数を表示
    print(df.info())		# 各列の情報を表示
    print(df.head())		# 表を頭から5行表示
    
    

    列'open'の穀物別時系列推移の可視化

    
    # plot関数の定義
    def openplot(type):
    	crop = df[df['commodity']==type]
    	plt.figure(figsize(6,3))
    	plt.plot(crop['date'], crop['open'], c='b', lw=0.5)
    	plt.title(type)
    	
    openplot('Soybean')
    openplot('Corn')
    openplot('KC HRW Wheat')
    openplot('Oat')
    openplot('Rough Rice')	
    
    

    Pycaretによるopen price予測のための機械学習モデルの作成

    
    # 不要な列の削除
    word_df = df.drop(columns=['ticker', 'high', 'low', 'close'])
    # Pycaretによるデータの前処理
    s = setup(word_df, target='open', session_id=123)
    
    # Pycaretによる機械学習モデルの作成・比較
    best = compare_models()
    
    

    Extra Trees Regessor model の予測誤差plot

    
    plot_model(best, plot='error')
    
    

    Feature Importance Plot

    
    plot_model(best, plot='feature')
    
    

    ページトップへ戻る